#ifndef __W25Q64_STORAGE_H
#define __W25Q64_STORAGE_H

#include "stm32f10x.h"
#include "bsp_dht11.h"

/* W25Q64存储相关定义 */
#define W25Q64_SECTOR_SIZE          4096        // 扇区大小4KB
#define W25Q64_PAGE_SIZE            256         // 页大小256字节
#define W25Q64_TOTAL_SIZE           (8*1024*1024)  // 总容量8MB

/* DHT11数据存储区域定义 */
#define DHT11_DATA_START_SECTOR     0           // DHT11数据起始扇区
#define DHT11_DATA_SECTOR_COUNT     16          // 分配16个扇区给DHT11数据(64KB)
#define DHT11_DATA_START_ADDR       (DHT11_DATA_START_SECTOR * W25Q64_SECTOR_SIZE)
#define DHT11_DATA_END_ADDR         ((DHT11_DATA_START_SECTOR + DHT11_DATA_SECTOR_COUNT) * W25Q64_SECTOR_SIZE - 1)

/* 存储管理相关定义 */
#define DHT11_RECORD_SIZE           sizeof(DHT11_W25Q64_Data_TypeDef)
#define MAX_RECORDS_PER_SECTOR      (W25Q64_SECTOR_SIZE / DHT11_RECORD_SIZE)
#define MAX_DHT11_RECORDS           (DHT11_DATA_SECTOR_COUNT * MAX_RECORDS_PER_SECTOR)

/* 存储信息扇区(用于存储元数据) */
#define STORAGE_INFO_SECTOR         16          // 第16个扇区存储管理信息
#define STORAGE_INFO_ADDR           (STORAGE_INFO_SECTOR * W25Q64_SECTOR_SIZE)

/* DHT11 W25Q64存储数据结构 */
typedef struct
{
    uint8_t  humi_int;      // 湿度整数部分
    uint8_t  humi_deci;     // 湿度小数部分
    uint8_t  temp_int;      // 温度整数部分
    uint8_t  temp_deci;     // 温度小数部分
    uint8_t  check_sum;     // 校验和
    uint8_t  valid_flag;    // 有效标志 0xAA=有效, 0xFF=无效
    uint8_t  reserved[6];   // 保留字节，保证32字节对齐
} DHT11_W25Q64_Data_TypeDef;

/* 存储管理信息结构 */
typedef struct
{
    uint32_t magic_number;      // 魔数标识 0x12345678
    uint32_t total_records;     // 总记录数
    uint32_t current_sector;    // 当前写入扇区
    uint32_t current_offset;    // 当前扇区内偏移
    uint32_t oldest_record_addr; // 最旧记录地址(环形缓冲区)
    uint32_t newest_record_addr; // 最新记录地址
    uint8_t  storage_mode;      // 存储模式: 0=覆盖模式, 1=环形缓冲模式
    uint8_t  reserved[15];      // 保留字节
} W25Q64_Storage_Info_TypeDef;

/* W25Q64存储操作状态 */
typedef enum
{
    W25Q64_STORAGE_SUCCESS = 0,
    W25Q64_STORAGE_ERROR,
    W25Q64_STORAGE_FULL,
    W25Q64_STORAGE_EMPTY,
    W25Q64_STORAGE_INVALID_PARAM,
    W25Q64_STORAGE_CHIP_ERROR
} W25Q64_Storage_Status_TypeDef;

/* 存储模式定义 */
typedef enum
{
    STORAGE_MODE_OVERWRITE = 0,     // 覆盖模式(只保存最新一条)
    STORAGE_MODE_CIRCULAR = 1       // 环形缓冲模式(保存多条，满了覆盖最旧的)
} Storage_Mode_TypeDef;

/* 函数声明 */
W25Q64_Storage_Status_TypeDef W25Q64_Storage_Init(void);
W25Q64_Storage_Status_TypeDef W25Q64_Storage_Test(void);
W25Q64_Storage_Status_TypeDef W25Q64_Storage_Format(void);

/* DHT11数据存储相关函数 */
W25Q64_Storage_Status_TypeDef DHT11_W25Q64_SaveData(DHT11_Data_TypeDef *dht11_data);
W25Q64_Storage_Status_TypeDef DHT11_W25Q64_ReadLatestData(DHT11_W25Q64_Data_TypeDef *data);
W25Q64_Storage_Status_TypeDef DHT11_W25Q64_ReadDataByIndex(uint32_t index, DHT11_W25Q64_Data_TypeDef *data);
W25Q64_Storage_Status_TypeDef DHT11_W25Q64_EraseAllData(void);

/* 存储管理函数 */
W25Q64_Storage_Status_TypeDef W25Q64_Storage_SetMode(Storage_Mode_TypeDef mode);
Storage_Mode_TypeDef W25Q64_Storage_GetMode(void);
uint32_t DHT11_W25Q64_GetRecordCount(void);
uint8_t DHT11_W25Q64_HasValidData(void);

/* 调试和维护函数 */
void W25Q64_Storage_PrintInfo(void);
void DHT11_W25Q64_PrintAllData(void);

#endif
